/**********************************************************************************
 ***
 ***    Screencasting Teaching System C++ Library
 ***    Copyright (C) 2011  Jiri Novak <jiri.novak@petriny.net>
 ***                        Wadi Jalil Maluf <wadijm@gmail.com>
 ***
 ***    This file is part of the Screencasting Teaching System C++ Library.
 ***
 ***    This library is free software; you can redistribute it and/or modify
 ***    it under the terms of the GNU General Public License as published by
 ***   the Free Software Foundation; either version 3 of the License, or
 ***    (at your option) any later version.
 ***
 ***    This library is distributed in the hope that it will be useful,
 ***    but WITHOUT ANY WARRANTY; without even the implied warranty of
 ***    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ***   GNU General Public License for more details.
 ***
 ***    You should have received a copy of the GNU General Public License
 ***    along with this library; if not, write to the Free Software
 ***    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 ***
 *********************************************************************************/

#ifndef SCREENCASTING_TEACHING_SYSTEM___SERVER___CLIENTSERVICE_H_
#define SCREENCASTING_TEACHING_SYSTEM___SERVER___CLIENTSERVICE_H_

#include "../common/xmlutil.h"
#include "../common/comm/mutex.h"
#include "../common/comm/lock.h"
#include "../common/model/course.h"
#include "../common/model/lesson.h"
#include "../common/model/user.h"
#include <list>
#include <log4cxx/logger.h>

/**
 *Clase que administra los datos persistentes de usuarios, cursos y lecciones
 *y provee una interfaz threadsafe para el acceso a los mismos. Seria aquella
 *clase responsable de acceder a los datos de la base de datos(en caso de que contasemos, por ejemplo
 *clase con alguna base SQL).
 */
class ClientService {
public:
	ClientService();
	virtual ~ClientService();
	/**
	 * Carga los datos de usuarios y cursos disponibles
	 */
	void loadData(std::istream& xmlCoursesAndLessons, std::istream& xmlusers);
	/**
	 * Hace el login de un usuario dado
	 * @return NULL en caso de que no halla encontrado al usuario
	 * o un puntero al mismo
	 */
	User* login(std::string user, std::string password);
	/**
	 * Busca una leccion devolviendo una referencia a la instancia
	 * que es compartida de manera persistente por varias instancias de
	 * ClientAttender
	 * @param lesson: Leccion a buscar por id
	 * @return NULL en caso de que no se encuentre
	 */
	Lesson* findLesson(Lesson &lessonName);
	/**
	 * Prepara la instancia de lección y sus usuarios para transmitirse
	 * y devuelve la instancia de Lesson que corresponde al cache en memoria
	 * del servidor.
	 */
	Lesson* startLesson(Lesson &lessonName);
	std::list<Course*> & getCourses() { return courses; }
	std::list<Lesson*> & getLessons() { return lessons; }
        /*
         *Setea al usuario dado para que no reciba datos de la lección especificada
         *@param user:usuario a setear
         *@param leccion que contiene usuario
         */
	void setStudentNotListening(User* user,Lesson* lesson) ;
	std::list<Course*> * findCourses(User* user) ;
	std::list<Lesson*> * findLessons(User* user) ;
private:
	bool isUserLogged(int idUser) ;
	XmlUtil xmlUtil;
	std::list<Course*> courses;
	std::list<Lesson*> lessons;
	std::list<User*> users;
	Mutex mutex;
	log4cxx::LoggerPtr logger_;
};

#endif /* SCREENCASTING_TEACHING_SYSTEM___SERVER___CLIENTSERVICE_H_ */
